package org.dromara.common.sse.utils

import io.github.oshai.kotlinlogging.KotlinLogging
import org.dromara.common.core.utils.SpringUtils
import org.dromara.common.sse.core.SseEmitterManager
import org.dromara.common.sse.dto.SseMessageDto

/**
 * SSE工具类
 *
 * @author Lion Li
 * @updater LikeYouDo
 */
object SseMessageUtils {
    private val log = KotlinLogging.logger {}

    private val SSE_ENABLE: Boolean = SpringUtils.getProperty("sse.enabled", Boolean::class.java, true)
    private lateinit var MANAGER: SseEmitterManager

    init {
        if (isEnable()) {
            MANAGER = SpringUtils.getBean(SseEmitterManager::class.java)
        }
    }

    /**
     * 向指定的SSE会话发送消息
     *
     * @param userId  要发送消息的用户id
     * @param message 要发送的消息内容
     */
    @JvmStatic
    fun sendMessage(userId: Long, message: String) {
        if (!isEnable()) {
            return
        }
        MANAGER.sendMessage(userId, message)
    }

    /**
     * 本机全用户会话发送消息
     *
     * @param message 要发送的消息内容
     */
    @JvmStatic
    fun sendMessage(message: String) {
        if (!isEnable()) {
            return
        }
        MANAGER.sendMessage(message)
    }

    /**
     * 发布SSE订阅消息
     *
     * @param sseMessageDto 要发布的SSE消息对象
     */
    @JvmStatic
    fun publishMessage(sseMessageDto: SseMessageDto) {
        if (!isEnable()) {
            return
        }
        MANAGER.publishMessage(sseMessageDto)
    }

    /**
     * 向所有的用户发布订阅的消息(群发)
     *
     * @param message 要发布的消息内容
     */
    @JvmStatic
    fun publishAll(message: String) {
        if (!isEnable()) {
            return
        }
        MANAGER.publishAll(message)
    }

    /**
     * 是否开启
     */
    @JvmStatic
    fun isEnable(): Boolean {
        return SSE_ENABLE
    }

}
